class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 
     * @param m int整型vector<vector<>> 
     * @return int整型
     */
    int citys(vector<vector<int> >& m) {
        int n1 = m.size(), n2= m[0].size();
        vector<int> arr(n1, -1);
        auto findRoot = [&](int x)
        {
            while(arr[x] != -1)
            {
                x = arr[x];
            }
            return x;
        };
        for(int i = 0; i < n1; ++i)
        {
            for(int j = 0; j < n2; ++j)
            {
                if(m[i][j] == 1)
                {
                    int x1 = findRoot(i);
                    int x2 = findRoot(j);
                    if(x1 != x2) // x2合到x1
                    {
                        arr[x1] = arr[x2]; // 写OJ时少了这句，但也能过
                        arr[x2] = x1;
                    }
                }
            }
        }
        int res = 0;
        for(auto& e : arr)
        {
            if(e == -1)
                ++res;
        }
        return res;
    }
};